package com.baiytfp.hf.HFDataExchange.action.service;

import com.baiytfp.hf.baiytfp.framework.base.BaseService;
import com.baiytfp.hf.baiytfp.hfutils.HFDBHelper;
import com.baiytfp.hf.baiytfp.hfutils.HFMap;
import com.baiytfp.hf.HFDataExchange.action.dao.AreaDAOImpl;
import com.baiytfp.hf.HFDataExchange.action.dao.MenuDAOImpl;
import com.baiytfp.hf.HFDataExchange.common.model.base.HFSysParams;
import com.baiytfp.hf.HFDataExchange.common.model.base.TableName;
import com.baiytfp.hf.HFDataExchange.common.model.table.User_account;
import com.baiytfp.hf.HFDataExchange.common.model.table.User_info;
import com.baiytfp.hf.HFDataExchange.common.utils.UserUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;

/**
 * Created by Steven-HF on 2017/5/13.
 */

@Service
public class AreaService extends BaseService {

	@Resource(name= HFSysParams.DB_TYPE + "AreaDAOImpl")
	private AreaDAOImpl areaDAO;


	public AreaService() throws Exception {

	}


	// 读取树 ( 只返回树数据，让前台自己组装 ) (先从子结点读起，适合组装成树)
	public List<Map> getTree(String treeType, boolean hasAuth, String userCode, String parentTreeCode)
			throws Exception {
		StringBuffer sWhere = new StringBuffer();
		List params = new ArrayList();
		StringBuffer sql = new StringBuffer();
		sql.append("select t1.*, attr.area_name, attr.area_code from ");
		sql.append(TableName.TREE + " t1 left join ");
		sql.append(TableName.AREA + " attr on t1.id=attr.tree_id ");

		if (sWhere.length() > 0) {
			sWhere.append(" and ");
		}
		sWhere.append(" TREE_TYPE=? and (IS_OPEN=1 OR IS_OPEN IS NULL) ");
		params.add(treeType);

		if (!"".equals(parentTreeCode)) {
			sWhere.append(" and tree_code like ? ");
			params.add(parentTreeCode + "%");
		}

		// 判断是否为超级管理员，如果为否，则加上访问限制，只有设置了权限的结点才能查看
		if (hasAuth && !UserUtil.isAdmin(userCode)) {

			User_account usersAccountVO = UserUtil.getUsersAccount(userCode);
			User_info userInfoVO = UserUtil.getUserInfo(userCode);

			if (sWhere.length() > 0) {
				sWhere.append(" and ");
			}
			sWhere.append(" exists (select 1 from (select node_seq, max(is_auth) as a, max(is_disabled) as d from "
					+ TableName.AUTH);
			sWhere.append("  where TREE_TYPE=? ");
			sWhere.append(" and ((OBJ_TYPE = 1 and OBJ_CODE=?) ");
//			if (!"".equals(StringUtil.getString(userVO.getUser_role()))) { // 当存在角色时，查询角色
//				sWhere.append(" OR (OBJ_TYPE = 3 and OBJ_CODE in ("
//						+ UserUtil.getSqlRoleCode(userVO.getUser_role())
//						+ ")) ");
//			}
//			if (!"".equals(StringUtil.getString(userInfoVO.getDept_seq_code()))) { // 当存在部门时，
//				// 查询部门
//				sWhere.append(" OR (OBJ_TYPE=2 and OBJ_CODE in ("
//						+ UserUtil.getSqlDeptCode(userInfoVO.getDept_seq_code())
//						+ "))   )");
//			}
			sWhere.append(" group by node_seq) t2 where t2.node_seq=t1.seq and t2.a=1 and t2.d<>1 or t2.d is null)   ");

			params.add(treeType);
			params.add(userCode);
		}

		// String orderBy =
		// " order by node_deep desc, parent_seq_code, node_order asc "; //
		// 先把父结点取出来
		String orderBy = " order by node_deep asc, parent_tree_code, node_order asc "; // 先把父结点取出来

		List<Map> list = HFDBHelper.querySql(sql + " where " + sWhere.toString() + orderBy, Map.class, params.toArray());

		return list;
	}


	// 用于生成一个以 map 的深度及 seq_code 为key 的树 (树结构)
	public Map generateTreeMap(List<Map> list) throws Exception {
		// 保存结果使用
		Map treeMap = null;
		// 临时数组（用于保存子结点信息）
		Map map_tempChild = new HashMap();
		// 临时父结点
		String tempParent = "null";

		Iterator<Map> it = list.iterator();
		while (it.hasNext()) { // 遍历列表（树节点）
			Map tmpMap = it.next();

			// 判断是否是同一个父节点
			if (!tempParent.equals(HFMap.getIstance().getString(tmpMap,
					"parent_tree_code"))) {
				/*
				 * 若不是同一个你节点，则先把之前所有的HTML存入 map, 清空 html, 更新父节点
				 */
				if (!"null".equals(tempParent)) {
					map_tempChild.put(tempParent, treeMap);
				}

				treeMap = new TreeMap(); // 重新建一个用来存放结点

				tempParent = HFMap.getIstance().getString(tmpMap, "parent_tree_code");
			}

			// children
			if (!"0".equals(HFMap.getIstance().getString(tmpMap, "children_number"))
					&& map_tempChild.get(HFMap.getIstance().getString(tmpMap,
					"tree_code")) != null) { // 是否有子节点
				// 如果有子节点，则把子节点的 HTML 加入本节点
				tmpMap.put("children", map_tempChild.get(HFMap.getIstance().getString(tmpMap, "tree_code")));
			}

			// 以 seq_code 为编码取结点
			treeMap.put(HFMap.getIstance().getString(tmpMap, "tree_code"), tmpMap);
		}

		return treeMap;
	}

	// 用于生成一个以 map 的深度及 没有 key 的树 (树+数组列表结构)
	public List<Map> generateTreeListMap(List<Map> list) throws Exception {
		// 保存结果使用
		List listMap = null;
		// 临时数组（用于保存子结点信息）
		Map map_tempChild = new HashMap();
		// 临时父结点
		String tempParent = "null";

		Iterator<Map> it = list.iterator();
		while (it.hasNext()) { // 遍历列表（树节点）
			Map tmpMap = it.next();

			// 判断是否是同一个父节点
			if (!tempParent.equals(HFMap.getIstance().getString(tmpMap,
					"parent_tree_code"))) {
				/*
				 * 若不是同一个你节点，则先把之前所有的HTML存入 map, 清空 html, 更新父节点
				 */
				if (!"null".equals(tempParent)) {
					map_tempChild.put(tempParent, listMap);
				}

				listMap = new ArrayList(); // 重新建一个用来存放结点

				tempParent =HFMap.getIstance().getString(tmpMap, "parent_tree_code");
			}

			// children
			if (!"0".equals(HFMap.getIstance().getString(tmpMap, "children_number"))
					&& map_tempChild.get(HFMap.getIstance().getString(tmpMap,
					"tree_code")) != null) { // 是否有子节点
				// 如果有子节点，则把子节点的 HTML 加入本节点
				tmpMap.put("children", map_tempChild.get(HFMap.getIstance().getString(tmpMap, "tree_code")));
			}

			// 以 seq_code 为编码取结点
			listMap.add(tmpMap);
		}

		return listMap;
	}

	// 用于生成一个以 map 的 seq_code 为key 的树 (列表结构)
	public Map generateMap(List<Map> list) throws Exception {
		// 保存结果使用
		Map treeMap = null;

		Iterator<Map> it = list.iterator();
		while (it.hasNext()) { // 遍历列表（树节点）
			Map tmpMap = it.next();

			// 以 seq_code 为编码取结点
			treeMap.put(HFMap.getIstance().getString(tmpMap, "tree_code"), tmpMap);
		}

		return treeMap;
	}

	// TODO 20160112 检测分类--保存
//	public long catalog_save(Std_chkcatalog chkcatalogVO, int isPublished)
//			throws Exception {
//
//		return TableVersionHelper.save(chkcatalogVO, TableName.STD_CHKCATALOG, (isPublished == 1));
//	}
//
//	// TODO 20160112 检测分类--更新
//	public long catalog_edit(Std_chkcatalog chkcatalogVO) throws Exception {
//		long res = -1;
//		Connection connection = null;
//		try{
//			connection = DBManager.getConnection();
//			connection.setAutoCommit(false);
//
//
//			//先更新版本信息
//			TableVersionHelper.save0(connection, chkcatalogVO, TableName.STD_CHKCATALOG);
//			//保存一个新版本
//			TableVersionHelper.saveAsNewVersion(connection, chkcatalogVO, TableName.STD_CHKCATALOG);
//
//			//取得最新的版本
//			Std_chkcatalog newChkcatalogVO = commonDAO.itemReadNotClose(connection, TableName.STD_CHKCATALOG, " where business_id=? and expiry_time=? ", Std_chkcatalog.class, new Object[]{chkcatalogVO.getBusiness_id(), TableVersionHelper.getVersionEndTime()});
//
//			//更新相关联的方法
//			StringBuffer fooditemSql = new StringBuffer();
//			fooditemSql.append("select * from " + TableName.STD_FOODITEM + " t ");
//			List<Std_fooditem> fooditemList = commonDAO.getAllList(DBManager.getConnection(), fooditemSql, " food_id=? and version_number=0 ", "", Std_fooditem.class, new Object[]{chkcatalogVO.getId() });
//
//
//			Std_fooditem fooditemVO = null;
//			Iterator<Std_fooditem> fooditemIterator = fooditemList.iterator();
//			while(fooditemIterator.hasNext()){
//				fooditemVO = fooditemIterator.next();
//
//				//设置最新的item_id
//				fooditemVO.setFood_id(newChkcatalogVO.getId());
//
//				fooditemVO.setItem_id(TableVersionHelper.getNewVersionIdNotCloes(TableName.STD_CHKITEM, fooditemVO.getItem_id() + "", Std_chkitem.class,connection));
//				fooditemVO.setDefault_method(TableVersionHelper.getNewVersionIdNotCloes(TableName.STD_CHKMETHOD, fooditemVO.getDefault_method() + "", Std_chkmethod.class,connection));
//
//				//先更新检测方法
//				TableVersionHelper.editNotCommit(connection, fooditemVO, TableName.STD_FOODITEM, false);
//
//
//				//取得最新的版本
//				Std_fooditem newFooditemVO = commonDAO.itemReadNotClose(connection, TableName.STD_FOODITEM, " where business_id=? and expiry_time=? ", Std_fooditem.class, new Object[]{fooditemVO.getBusiness_id(), TableVersionHelper.getVersionEndTime()});
//
//
//				//更新相关联的原始记录模板绑定
//				StringBuffer sql = new StringBuffer();
//				sql.append("select * from " + TableName.STD_CHKITEM_M_RECORD + " t ");
//				List<Std_chkitem_m_record> cmrecordList = commonDAO.getAllList(DBManager.getConnection(), sql, " CATA_ITEM_ID=? and version_number=0 ", "", Std_chkitem_m_record.class, new Object[]{fooditemVO.getId() });
//
//				Std_chkitem_m_record cmrecordVO = null;
//				Iterator<Std_chkitem_m_record> iterator = cmrecordList.iterator();
//				while(iterator.hasNext()){
//					cmrecordVO = iterator.next();
//
//					cmrecordVO.setCata_item_id(newFooditemVO.getId());
//
//					cmrecordVO.setChk_method(TableVersionHelper.getNewVersionIdNotCloes(TableName.STD_CHKMETHOD, cmrecordVO.getChk_method() + "", Std_chkmethod.class,connection));
//
//					//更新相关联的原始记录模板绑定 的版本
//					TableVersionHelper.editNotCommit(connection, cmrecordVO, TableName.STD_CHKITEM_M_RECORD, false);
//				}
//			}
//
//
//
//			connection.commit();
//		}catch(Exception se){
//			DBManager.rollbackTransaction(connection);
//			throw se;
//		}finally{
//			DBManager.close(connection);
//		}
//		return res;
//	}
//
//	//检测分类删除
//	public long catalog_del(Object[] params) throws Exception{
//
//		return TableVersionHelper.delete(TableName.STD_CHKCATALOG, params);
//	}

	/**
	 * 根据tree_id
	 * @param treeType
	 * @param tree_id
	 * @return
	 * @throws Exception
	 */
	public List<Map> getTreeList(String treeType, String tree_id) throws Exception {
		// TODO Auto-generated method stub
		return areaDAO.getTreeList(treeType,tree_id);
	}
	/**
	 * 根据 地区树 顶级节点的 tree_code 获取子节点
	 * @param treeType
	 * @param toptree_code
	 * @return
	 * @throws Exception
	 */
	public List<Map> getAreaList(String treeType, String toptree_code) throws Exception {
		return areaDAO.getAreaList(treeType,toptree_code);
	}

}

